/**
  ******************************************************************************
  * @file    sym32l010_hal_rtc.c
  * @author  AE Team
  * @version 1.0.3
  * @date    2024-05-28
  * @brief   RTC HAL module driver.
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "sym32l010_hal_rtc.h"


/*******************************************************************************
  * @brief  解除RTC寄存器的写保护
  * @param  None
  * @retval None
  * @note   None
  */
void HAL_RTC_Regs_Unlock(void)
{
    SYM_RTC->KEY = 0xCA;
    SYM_RTC->KEY = 0x53;
}


/*******************************************************************************
  * @brief  使能RTC寄存器的写保护
  * @param  None
  * @retval None
  * @note   None
  */
void HAL_RTC_Regs_Lock(void)
{
    SYM_RTC->KEY = 0xCA;
    SYM_RTC->KEY = 0x00;
}


/*******************************************************************************
  * @brief  RTC 日历初始化
  * @param  InitStruct: 初始化结构体
  * @retval None
  * @note   需通过APBENx寄存器使能RTC的时钟后，才可调用该函数
  */
void HAL_RTC_Calendar_Init(RTC_Calendar_InitTypeDef *InitStruct)
{
    uint16_t tmp16 = SYM_SYSCTRL->RESETFLAG;
    REGBITS_CLR(SYM_SYSCTRL->RESETFLAG, SYSCTRL_RESETFLAG_POR_Msk);   // 清除上电复位标志

    if (tmp16 & SYSCTRL_RESETFLAG_POR_Msk)                            // 上电复位
    {
        HAL_RTC_Regs_Unlock();

        REGBITS_MODIFY(SYM_RTC->CR1, RTC_CR1_SOURCE_Msk, (uint32_t)InitStruct->ClockSource);
        REGBITS_MODIFY(SYM_RTC->CR0, RTC_CR0_H24_Msk | RTC_CR0_INTERVAL_Msk,
                       (uint32_t)InitStruct->HourMode | (uint32_t)InitStruct->Interval);

        SYM_RTC->DATE = (InitStruct->Week   << RTC_DATE_WEEK_Pos)   |
                        (InitStruct->Year   << RTC_DATE_YEAR_Pos)   |
                        (InitStruct->Month  << RTC_DATE_MONTH_Pos)  |
                        (InitStruct->Day    << RTC_DATE_DAY_Pos);
        SYM_RTC->TIME = (InitStruct->Hour   << RTC_TIME_HOUR_Pos)   |
                        (InitStruct->Minute << RTC_TIME_MINUTE_Pos) |
                        (InitStruct->Second << RTC_TIME_SECOND_Pos);

        HAL_RTC_Regs_Lock();
    }

}


/*******************************************************************************
  * @brief  RTC 内置唤醒定时器初始化
  * @param  InitStruct: 初始化结构体
  * @retval None
  * @note   1. 需通过APBENx寄存器使能RTC的时钟后，才可调用该函数
  *         2. 当选择TICKCLK作为AWT的时钟源时，需要RTC工作于运行状态
  */
void HAL_RTC_AWT_Init(RTC_AWT_InitTypeDef *InitStruct)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_MODIFY(SYM_RTC->CR2, RTC_CR2_AWTSRC_Msk    | RTC_CR2_AWTPRS_Msk,
                       (uint32_t)InitStruct->ClkSource | (uint32_t)InitStruct->Prescaler);

    SYM_RTC->AWTARR = InitStruct->Reload;
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  使能RTC入侵检测
  * @param  TampEdge: 入侵检测有效边沿配置
  *                   @arg RTC_TAMPEDGE_RISE
  *                   @arg RTC_TAMPEDGE_FALL
  * @retval None
  * @note   None
  */
void HAL_RTC_TAMP_Enable(RTC_TampedgeTypeDef TampEdge)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_MODIFY(SYM_RTC->CR2, RTC_CR2_TAMPEDGE_Msk | RTC_CR2_TAMPEN_Msk,
                                   (uint32_t)TampEdge | RTC_CR2_TAMPEN_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  禁止RTC入侵检测
  * @param  None
  * @retval None
  * @note   None
  */
void HAL_RTC_TAMP_Disable(void)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_CLR(SYM_RTC->CR2, RTC_CR2_TAMPEN_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  RTCCLK 来源配置
  * @param  InitStruct: 初始化结构体
  * @retval None
  * @note   1. 需通过APBENx寄存器使能RTC的时钟后，才可调用该函数
  *         2. RTCCLK频率 / (PSC1 + 1)应不大于1MHz
  *         3. RTCCLK频率 / (PSC1 + 1) / (PSC2 + 1)应等于2MHz
  */
HAL_StatusTypeDef HAL_RTCCLK_Config(RTC_ClkCfg_InitTypeDef *InitStruct)
{
    uint32_t frequency = InitStruct->ClkSrcFreq / (InitStruct->Psc1 + 1);

    if ((frequency > 1000000) || (InitStruct->ClkSrcFreq == 0))
    {
        return HAL_ERROR;
    }

    HAL_RTC_Regs_Unlock();
    REGBITS_MODIFY(SYM_RTC->CR1, RTC_CR1_SOURCE_Msk, (uint32_t)InitStruct->ClkSrc);
    REGBITS_MODIFY(SYM_RTC->PSC, RTC_PSC_PSC1_Msk,   (uint32_t)InitStruct->Psc1);
    REGBITS_MODIFY(SYM_RTC->PSC, RTC_PSC_PSC2_Msk,   (uint32_t)InitStruct->Psc2);
    HAL_RTC_Regs_Lock();
    return HAL_OK;
}


/*******************************************************************************
  * @brief  RTC 反初始化
  * @param  None
  * @retval None
  */
void HAL_RTC_DeInit(void)
{
    REGBITS_CLR(SYM_SYSCTRL->APBRST2, SYSCTRL_APBRST2_RTC_Msk);
    REGBITS_SET(SYM_SYSCTRL->APBRST2, SYSCTRL_APBRST2_RTC_Msk);
}


/*******************************************************************************
  * @brief  启动 RTC 日历
  * @param  None
  * @retval None
  */
void HAL_RTC_Calendar_Start(void)
{
    HAL_RTC_Regs_Unlock();

    REGBITS_SET(SYM_RTC->CR0, RTC_CR0_START_Msk);
    while (SYM_RTC->CR1 & RTC_CR1_SYNC_Msk) { ; }

    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  停止 RTC 日历
  * @param  None
  * @retval None
  */
void HAL_RTC_Calendar_Stop(void)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_CLR(SYM_RTC->CR0, RTC_CR0_START_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  启动 RTC 内置唤醒定时器
  * @param  None
  * @retval None
  * @note   当选择TICKCLK作为AWT的时钟源时，需要RTC工作于运行状态
  */
void HAL_RTC_AWT_Start(void)
{
    HAL_RTC_Regs_Unlock();

    REGBITS_SET(SYM_RTC->CR2, RTC_CR2_AWTEN_Msk);
    while (SYM_RTC->CR1 & RTC_CR1_SYNC_Msk) { ; }

    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  停止 RTC 内置唤醒定时器
  * @param  None
  * @retval None
  */
void HAL_RTC_AWT_Stop(void)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_CLR(SYM_RTC->CR2, RTC_CR2_AWTEN_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  获取 RTC 唤醒定时器当前计数值
  * @param  None
  * @retval 当前计数值
  */
uint16_t HAL_RTC_AWT_GetCnt(void)
{
    uint32_t Cnt1, Cnt2;

    do
    {
        Cnt1 = SYM_RTC->AWTCNT;
        Cnt2 = SYM_RTC->AWTCNT;
    } while (Cnt1 != Cnt2);

    return (uint16_t)Cnt1;
}


/*******************************************************************************
  * @brief  设置 RTC 日历的日期和时间
  * @param  pDateTime: 日期和时间配置结构体
  * @retval None
  * @note   该函数用于在RTC运行过程中设置RTC的日期和时间，因此需要在RTC启动之后才可调用该函数
  */
void HAL_RTC_Calendar_SetDateTime(RTC_CalendarDateTimeTypeDef *pDateTime)
{
    HAL_RTC_Regs_Unlock();

    SYM_RTC->DATE = (pDateTime->Week   << RTC_DATE_WEEK_Pos)  |
                    (pDateTime->Year   << RTC_DATE_YEAR_Pos)  |
                    (pDateTime->Month  << RTC_DATE_MONTH_Pos) |
                    (pDateTime->Day    << RTC_DATE_DAY_Pos);
    SYM_RTC->TIME = (pDateTime->Hour   << RTC_TIME_HOUR_Pos)   |
                    (pDateTime->Minute << RTC_TIME_MINUTE_Pos) |
                    (pDateTime->Second << RTC_TIME_SECOND_Pos);
    while (SYM_RTC->CR1 & RTC_CR1_SYNC_Msk) { ; }
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  设置 RTC 日期
  * @param  pDate: 日期配置结构体
  * @retval None
  * @note   该函数用于在RTC运行过程中设置RTC的日期，因此需要在RTC启动之后才可调用该函数
  */
void HAL_RTC_Calendar_SetDate(RTC_CalendarDateTypeDef *pDate)
{
    HAL_RTC_Regs_Unlock();

    SYM_RTC->DATE = (pDate->Week  << RTC_DATE_WEEK_Pos)  |
                    (pDate->Year  << RTC_DATE_YEAR_Pos)  |
                    (pDate->Month << RTC_DATE_MONTH_Pos) |
                    (pDate->Day   << RTC_DATE_DAY_Pos);
    while (SYM_RTC->CR1 & RTC_CR1_SYNC_Msk) { ; }
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  设置 RTC 时间
  * @param  pTime: 时间配置结构体
  * @retval None
  * @note   该函数用于在RTC运行过程中设置RTC的时间，因此需要在RTC启动之后才可调用该函数
  */
void HAL_RTC_Calendar_SetTime(RTC_CalendarTimeTypeDef *pTime)
{
    HAL_RTC_Regs_Unlock();

    SYM_RTC->TIME = (pTime->Hour   << RTC_TIME_HOUR_Pos)   |
                    (pTime->Minute << RTC_TIME_MINUTE_Pos) |
                    (pTime->Second << RTC_TIME_SECOND_Pos);
    while (SYM_RTC->CR1 & RTC_CR1_SYNC_Msk) { ; }
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  获取 RTC 亚秒时刻
  * @param  None
  * @retval float: 返回float类型的浮点数，亚秒值(s)
  */
float HAL_RTC_GetSubSecond(void)
{
    uint32_t SS1, SS2;
    float SubSecond;

    do
    {
        do
        {
            SS1 = SYM_RTC->SSCNT;
            SS2 = SYM_RTC->SSCNT;
        } while (SS1 != SS2);
    } while ((SS1 & 0xFFFFF) == 0);

    SubSecond = 0.5 * (SS1 & 0xFFFFF) / ((SYM_RTC->PSC & 0xFFFFF) + 1) + ((SS1 & 0x100000) ? 0.5 : 0); 
    return SubSecond;
}


/*******************************************************************************
  * @brief  获取 RTC 日历的日期和时间
  * @param  pDateTime: 待返回日期和时间的指针
  * @retval None
  */
void HAL_RTC_Calendar_GetDateTime(RTC_CalendarDateTimeTypeDef *pDateTime)
{
    uint32_t Date1, Date2;
    uint32_t Time1, Time2;

    do
    {
        Date1 = SYM_RTC->DATE;
        Time1 = SYM_RTC->TIME;
        Date2 = SYM_RTC->DATE;
        Time2 = SYM_RTC->TIME;

    } while ((Time1 != Time2) || (Date1 != Date2));

    pDateTime->Week   = (Date1 >> RTC_DATE_WEEK_Pos)   &
                        (RTC_DATE_WEEK_Msk   >> RTC_DATE_WEEK_Pos);
    pDateTime->Year   = (Date1 >> RTC_DATE_YEAR_Pos)   &
                        (RTC_DATE_YEAR_Msk   >> RTC_DATE_YEAR_Pos);
    pDateTime->Month  = (Date1 >> RTC_DATE_MONTH_Pos)  &
                        (RTC_DATE_MONTH_Msk  >> RTC_DATE_MONTH_Pos);
    pDateTime->Day    = (Date1 >> RTC_DATE_DAY_Pos)    &
                        (RTC_DATE_DAY_Msk    >> RTC_DATE_DAY_Pos);
    pDateTime->Hour   = (Time1 >> RTC_TIME_HOUR_Pos)   &
                        (RTC_TIME_HOUR_Msk   >> RTC_TIME_HOUR_Pos);
    pDateTime->Minute = (Time1 >> RTC_TIME_MINUTE_Pos) &
                        (RTC_TIME_MINUTE_Msk >> RTC_TIME_MINUTE_Pos);
    pDateTime->Second = (Time1 >> RTC_TIME_SECOND_Pos) &
                        (RTC_TIME_SECOND_Msk >> RTC_TIME_SECOND_Pos);
}


/*******************************************************************************
  * @brief  获取 RTC 日历的日期
  * @param  pDate: 待返回日期的指针
  * @retval None
  */
void HAL_RTC_Calendar_GetDate(RTC_CalendarDateTypeDef *pDate)
{
    uint32_t Date1, Date2;

    do
    {
        Date1 = SYM_RTC->DATE;
        Date2 = SYM_RTC->DATE;
    } while (Date1 != Date2);

    pDate->Week  = (Date1 >> RTC_DATE_WEEK_Pos)  & (RTC_DATE_WEEK_Msk  >> RTC_DATE_WEEK_Pos);
    pDate->Year  = (Date1 >> RTC_DATE_YEAR_Pos)  & (RTC_DATE_YEAR_Msk  >> RTC_DATE_YEAR_Pos);
    pDate->Month = (Date1 >> RTC_DATE_MONTH_Pos) & (RTC_DATE_MONTH_Msk >> RTC_DATE_MONTH_Pos);
    pDate->Day   = (Date1 >> RTC_DATE_DAY_Pos)   & (RTC_DATE_DAY_Msk   >> RTC_DATE_DAY_Pos);
}


/*******************************************************************************
  * @brief  获取 RTC 日历的时间
  * @param  pTime: 待返回时间的指针
  * @retval None
  */
void HAL_RTC_Calendar_GetTime(RTC_CalendarTimeTypeDef *pTime)
{
    uint32_t Time1, Time2;

    do
    {
        Time1 = SYM_RTC->TIME;
        Time2 = SYM_RTC->TIME;

    } while (Time1 != Time2);

    pTime->Hour   = (Time1 >> RTC_TIME_HOUR_Pos)   & (RTC_TIME_HOUR_Msk   >> RTC_TIME_HOUR_Pos);
    pTime->Minute = (Time1 >> RTC_TIME_MINUTE_Pos) & (RTC_TIME_MINUTE_Msk >> RTC_TIME_MINUTE_Pos);
    pTime->Second = (Time1 >> RTC_TIME_SECOND_Pos) & (RTC_TIME_SECOND_Msk >> RTC_TIME_SECOND_Pos);
}


/*******************************************************************************
  * @brief  获取 RTC 入侵时刻的日期和时间
  * @param  pDateTime: 待返回日期和时间的指针
  * @retval None
  */
void HAL_RTC_TAMP_GetDateTime(RTC_CalendarDateTimeTypeDef *pDateTime)
{
    pDateTime->Week   = SYM_RTC->TAMPDATE_f.WEEK;
    pDateTime->Month  = SYM_RTC->TAMPDATE_f.MONTH;
    pDateTime->Day    = SYM_RTC->TAMPDATE_f.DAY;
    pDateTime->Hour   = SYM_RTC->TAMPTIME_f.HOUR;
    pDateTime->Minute = SYM_RTC->TAMPTIME_f.MINUTE;
    pDateTime->Second = SYM_RTC->TAMPTIME_f.SECOND;
}


/*******************************************************************************
  * @brief  为当前时间增加指定时长
  * @param  pCurTime: 当前时间的结构体指针
  * @param  AddSecs : 需要增加的时长，以秒为单位
  * @retval None
  * @note   增加指定时长后的时间
  * @note   只接受24小时制
  */
void HAL_RTC_Time_AddSeconds(RTC_CalendarTimeTypeDef *pCurTime, uint16_t AddSecs)
{
    pCurTime->Hour   = (pCurTime->Hour   & 0x0F) + ((pCurTime->Hour   >> 4) * 10);
    pCurTime->Minute = (pCurTime->Minute & 0x0F) + ((pCurTime->Minute >> 4) * 10);
    pCurTime->Second = (pCurTime->Second & 0x0F) + ((pCurTime->Second >> 4) * 10);

    pCurTime->Second += AddSecs;
    pCurTime->Minute += (pCurTime->Second / 60);
    pCurTime->Hour   += (pCurTime->Minute / 60);
    pCurTime->Second %= 60;
    pCurTime->Minute %= 60;
    pCurTime->Hour   %= 24;

    pCurTime->Second = (pCurTime->Second % 10) | (pCurTime->Second / 10 * 16);
    pCurTime->Minute = (pCurTime->Minute % 10) | (pCurTime->Minute / 10 * 16);
    pCurTime->Hour   = (pCurTime->Hour   % 10) | (pCurTime->Hour   / 10 * 16);
}


/*******************************************************************************
  * @brief  配置 Alarm A
  * @param  pAlarm: 闹钟配置结构体
  * @retval None
  */
void HAL_RTC_AlarmA_Config(RTC_Alarm_InitTypeDef *pAlarm)
{
    HAL_RTC_Regs_Unlock();
    SYM_RTC->ALARMA = (uint32_t)pAlarm->AlarmWeek   |
                      (uint32_t)pAlarm->HourCheck   |
                      (uint32_t)pAlarm->MinuteCheck |
                      (uint32_t)pAlarm->SecondCheck |
                      (pAlarm->Hour   << RTC_ALARMB_HOUR_Pos)   |
                      (pAlarm->Minute << RTC_ALARMB_MINUTE_Pos) |
                      (pAlarm->Second << RTC_ALARMB_SECOND_Pos);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  使能 Alarm - A
  * @param  None
  * @retval None
  */
void HAL_RTC_AlarmA_Enable(void)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_SET(SYM_RTC->CR2, RTC_CR2_ALARMAEN_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  禁止 Alarm - A
  * @param  None
  * @retval None
  */
void HAL_RTC_AlarmA_Disable(void)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_CLR(SYM_RTC->CR2, RTC_CR2_ALARMAEN_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  配置 Alarm B
  * @param  pAlarm: 闹钟配置结构体
  * @retval None
  */
void HAL_RTC_AlarmB_Config(RTC_Alarm_InitTypeDef *pAlarm)
{
    HAL_RTC_Regs_Unlock();
    SYM_RTC->ALARMB = (uint32_t)pAlarm->AlarmWeek   |
                      (uint32_t)pAlarm->HourCheck   |
                      (uint32_t)pAlarm->MinuteCheck |
                      (uint32_t)pAlarm->SecondCheck |
                      (pAlarm->Hour   << RTC_ALARMB_HOUR_Pos)   |
                      (pAlarm->Minute << RTC_ALARMB_MINUTE_Pos) |
                      (pAlarm->Second << RTC_ALARMB_SECOND_Pos);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  使能 Alarm - B
  * @param  None
  * @retval None
  */
void HAL_RTC_AlarmB_Enable(void)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_SET(SYM_RTC->CR2, RTC_CR2_ALARMBEN_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  禁止 Alarm - B
  * @param  None
  * @retval None
  */
void HAL_RTC_AlarmB_Disable(void)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_CLR(SYM_RTC->CR2, RTC_CR2_ALARMBEN_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  配置时钟误差补偿
  * @param  Period: 配置补偿周期
  *                 @arg RTC_COMPEN_PERIOD_32S
  *                 @arg RTC_COMPEN_PERIOD_128S
  *                 @arg RTC_COMPEN_PERIOD_256S
  * @param  Sign  : 配置补偿方向，加计数 或 减计数
  *                 @arg RTC_COMPEN_SIGN_INC
  *                 @arg RTC_COMPEN_SIGN_DEC
  * @param  Value : 配置补偿值
  *                 周期为32秒时， 取值范围为 0x000 ~ 0x1FF
  *                 周期为128秒时，取值范围为 0x000 ~ 0x7FF
  *                 周期为256秒时，取值范围为 0x000 ~ 0xFFF
  * @retval None
  */
void HAL_RTC_Compen_Config(RTC_CompenPeriodTypeDef Period, RTC_CompenSignTypeDef Sign, uint16_t Value)
{
    HAL_RTC_Regs_Unlock();
    SYM_RTC->COMPCFR1 = Value | (uint32_t)Period | (uint32_t)Sign | (0x08UL << RTC_COMPCFR1_EN_Pos);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  使能时钟误差补偿功能
  * @param  None
  * @retval None
  */
void HAL_RTC_Compen_Enable(void)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_SET(SYM_RTC->COMPCFR1, RTC_COMPCFR1_EN_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  禁止时钟误差补偿功能
  * @param  None
  * @retval None
  */
void HAL_RTC_Compen_Disable(void)
{
    HAL_RTC_Regs_Unlock();
    REGBITS_CLR(SYM_RTC->COMPCFR1, RTC_COMPCFR1_EN_Msk);
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  配置RTC1Hz管脚输出的信号的补偿方式
  * @param  Rtc1HzCfg: 输出信号的补偿方式
  *                    @arg RTC_1HZ_RTCCLK
  *                    @arg RTC_1HZ_PCLK
  * @retval None
  */
void HAL_RTC_1Hz_Config(RTC_CompenSourceTypeDef Rtc1HzCfg)
{
    HAL_RTC_Regs_Unlock();
    SYM_RTC->CR0_f.RTC1HZ = (uint32_t)Rtc1HzCfg;
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  使能RTC中断
  * @param  ITSource: 待使能的中断
  *                   @arg RTC_IT_SOURCE_INTERVAL
  *                   @arg RTC_IT_SOURCE_TAMPOV
  *                   @arg RTC_IT_SOURCE_TAMP
  *                   @arg RTC_IT_SOURCE_AWTIMER
  *                   @arg RTC_IT_SOURCE_ALARMB
  *                   @arg RTC_IT_SOURCE_ALARMA
  * @retval None
  */
void HAL_RTC_ENABLE_IT(uint32_t ITSource)
{
    HAL_RTC_Regs_Unlock();
    SYM_RTC->IER |= (uint32_t)ITSource;
    HAL_RTC_Regs_Lock();
}


/*******************************************************************************
  * @brief  禁止RTC中断
  * @param  ITSource: 待禁止的中断
  *                   @arg RTC_IT_SOURCE_INTERVAL
  *                   @arg RTC_IT_SOURCE_TAMPOV
  *                   @arg RTC_IT_SOURCE_TAMP
  *                   @arg RTC_IT_SOURCE_AWTIMER
  *                   @arg RTC_IT_SOURCE_ALARMB
  *                   @arg RTC_IT_SOURCE_ALARMA
  * @retval None
  */
void HAL_RTC_DISABLE_IT(uint32_t ITSource)
{
    HAL_RTC_Regs_Unlock();
    SYM_RTC->IER &= ~((uint32_t)ITSource);
    HAL_RTC_Regs_Lock();
}


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
